/**
 * 
 */
package es.uma.scgt.autenticacion;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.transaction.annotation.Transactional;

import es.uma.scgt.dao.UsuarioDao;
import es.uma.scgt.modelo.Usuario;

/**
 * @author Vaio
 * 
 */
public class UserDetailServiceImpl implements UserDetailsService {

	@Autowired
	private UsuarioDao usuarioDao;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.springframework.security.core.userdetails.UserDetailsService#
	 * loadUserByUsername(java.lang.String)
	 */
	@Transactional
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {

		UserDetails userDetails = new UserDetailsImpl();

		try {
			List<Usuario> listUsuarios = usuarioDao.usuarioPorEmail(username);
			if (listUsuarios != null && 1 == listUsuarios.size()) {
				// existe usuario
				userDetails = convertirUsuarioAUserDetails(listUsuarios.get(0));
			} else {
				// No existe el usuario entoces exception
				throw new UsernameNotFoundException(
						"Usuario/Password Incorrecto");
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new UsernameNotFoundException("Usuario/Password Incorrecto");
		}

		return userDetails;
	}

	private UserDetails convertirUsuarioAUserDetails(Usuario usuario) {
		UserDetailsImpl userDetails = new UserDetailsImpl();

		userDetails.setContrasena(usuario.getPassword());
		userDetails.setEmail(usuario.getEmail());
		userDetails.setUsuarioId(usuario.getId());
		userDetails.setListaEquipos(usuario.getEquipo());

		Collection<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
		if (usuario.getRol() != null) {
			// El usuario tiene al menos un rol
			String nombreRole = usuario.getRol().getNombre();
			StringTokenizer tokenizer = new StringTokenizer(nombreRole, ";");
			while(tokenizer.hasMoreTokens()){
				String token = tokenizer.nextToken();
				roles.add(new GrantedAuthorityImpl(token));
			}
		}else{
			// el usuario no tiene rol, entonces lanzamos una exception diciendo que el usuario no se ha encontrado
			throw new UsernameNotFoundException(
					"Usuario/Password Incorrecto o privilegios insuficientes");
		}
		userDetails.setRoles(roles);

		return userDetails;
	}

	public UsuarioDao getUsuarioDao() {
		return usuarioDao;
	}

	public void setUsuarioDao(UsuarioDao usuarioDao) {
		this.usuarioDao = usuarioDao;
	}

}
